package com.bbz.core.concurrency.work1;

/**
 * 线程执行顺序Demo join方法可以看做是线程间协作的一种方式， 很多时候，一个线程的输入可能非常依赖于另一个线程的输出，
 * 这就像两个好基友，一个基友先走在前面突然看见另一个基友落在后面了，这个时候他就会在原处等一等这个基友，
 * 等基友赶上来后，就两人携手并进。其实线程间的这种协作方式也符合现实生活。
 * 在软件开发的过程中，从客户那里获取需求后，需要经过需求分析师进行需求分解后，这个时候产品，开发才会继续跟进。
 * 
 * ******如果一个线程实例A执行了threadB.join(),其含义是：当前线程A会等待threadB线程终止后threadA才会继续执行*****
 * 
 * @author binbin.a.zhang
 *
 */
public class JoinDemo {
	public static void main(String args[]) throws InterruptedException {
		Thread thread = Thread.currentThread();
		for (int i = 0; i <= 10; i++) {
			Thread curThread = new JoinThread(thread);
			curThread.start();
			thread = curThread;
		}
	}

	static class JoinThread extends Thread {
		private Thread thread;

		public JoinThread(Thread thread) {
			this.thread = thread;
		}

		@Override
		public void run() {
			try {
				thread.join();
				System.out.println(thread.getName() + " terminated.");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
